/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once


#include "节点/节点.h"

#include <向量.h>
#include <字符串转换.h>

#include <面/面.h>
#include <物体/物体.h>









class C_多边形边插座 : public C_插座基类 {
	S_边 m_默认值;
public:
	C_多边形边插座(std::u16string name);
	~C_多边形边插座();

	S_边* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void	f_setData(void* data, uint8 线程ID = 0);

	std::string		f_构建变量代码(int32 loc);
	bool			f_接入插座是否匹配(E_值类型 type);
	std::u16string	f_getTypeName() { return u"edge"; }
};

#define DEF_多边形边插座(socket)  dynamic_cast<C_多边形边插座*>( (socket) )
#define DEF_多边形边插座数据(socket)  ((S_边*)( (socket)->f_getData(0)) )

#define DEF_创建多边形边插座_I(name) socket = new C_多边形边插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输入);
#define DEF_创建多边形边插座_O(name) socket = new C_多边形边插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输出);




class C_多边形边_1D插座 : public C_插座基类 {
	S_边Array* m_默认值;
	S_边Array* m_转换值;
public:
	C_多边形边_1D插座(std::u16string name);
	~C_多边形边_1D插座();

	S_边Array* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void	f_setData(void* data, uint8 线程ID = 0);

	std::string		f_构建变量代码(int32 loc);
	bool			f_接入插座是否匹配(E_值类型 type);

	std::u16string    f_getTypeName() { return u"[edge]"; }
};

#define DEF_多边形边_1D插座(socket)  dynamic_cast<C_多边形边_1D插座*>( (socket) )
#define DEF_多边形边_1D插座数据(socket, tid)  ((std::vector<S_边>*)( (socket)->f_getData(tid)) )

#define DEF_创建多边形边_1D插座_I(name) socket = new C_多边形边_1D插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输入);
#define DEF_创建多边形边_1D插座_O(name) socket = new C_多边形边_1D插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输出);





class C_多边形面插座 : public C_插座基类 {
	S_面* m_默认值;
	S_面* m_转换值;
public:
	C_多边形面插座(std::u16string name);
	~C_多边形面插座();

	S_面* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void  f_setData(void* data, uint8 线程ID = 0);
	std::string	f_构建变量代码(int32 loc);
	bool		f_接入插座是否匹配(E_值类型 type);
	std::u16string		f_getTypeName() { return u"面"; }
};

#define DEF_多边形面插座(socket)  dynamic_cast<C_多边形面插座*>( (socket) )
#define DEF_多边形面插座数据(socket, tid)  ((S_面*)( (socket)->f_getData(tid)) )

#define DEF_创建多边形面插座_I(name) socket = new C_多边形面插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输入);
#define DEF_创建多边形面插座_O(name) socket = new C_多边形面插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输出);




class C_多边形元素插座 : public C_插座基类 {
	S_多边形元素* m_默认值;
	S_多边形元素* m_转换值;
public:
	C_多边形元素插座(std::u16string name);
	~C_多边形元素插座();

	S_多边形元素* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void  f_setData(void* data, uint8 线程ID = 0);
	std::string	f_构建变量代码(int32 loc);
	bool        f_接入插座是否匹配(E_值类型 type);

	std::u16string f_getTypeName() { return u"[面]"; }
};

#define DEF_多边形元素插座(socket)  dynamic_cast<C_多边形元素插座*>( (socket) )
#define DEF_多边形元素插座数据(socket, tid)  ((S_多边形元素*)( (socket)->f_getData(tid)) )

#define DEF_创建多边形元素插座_I(name) f_add插座(new C_多边形元素插座( (name) ), E_插座方向::e_插座Type_输入);
#define DEF_创建多边形元素插座_O(name) f_add插座(new C_多边形元素插座( (name) ), E_插座方向::e_插座Type_输出);




class C_多边形元素_1D插座 : public C_插座基类 {
	S_多边形元素Array* m_默认值;
	S_多边形元素Array* m_转换值;
public:
	C_多边形元素_1D插座(std::u16string name);
	~C_多边形元素_1D插座();

	S_多边形元素Array* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void  f_setData(void* data, uint8 线程ID = 0);
	std::string	f_构建变量代码(int32 loc);
	bool        f_接入插座是否匹配(E_值类型 type);

	std::u16string		f_getTypeName() { return u"[元素]"; }
};

#define DEF_多边形元素_1D插座(socket)  dynamic_cast<C_多边形元素_1D插座*>( (socket) )
#define DEF_多边形元素插座_1D数据(socket, tid)  ((S_多边形元素Array*)( (socket)->f_getData(tid)) )

#define DEF_创建多边形元素_1D插座_I(name) socket = new C_多边形元素_1D插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输入);
#define DEF_创建多边形元素_1D插座_O(name) socket = new C_多边形元素_1D插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输出);





class C_网格自定义属性插座 : public C_插座基类 {
	S_网格自定义属性 m_默认值;
	S_网格自定义属性 m_转换值;
public:
	C_网格自定义属性插座(std::u16string name);
	~C_网格自定义属性插座();

	S_网格自定义属性* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void  f_setData(void* data, uint8 线程ID = 0);
	std::string	f_构建变量代码(int32 loc);
	bool        f_接入插座是否匹配(E_值类型 type);

	void		f_读取(FILE* f);
	void		f_写入(FILE* f);

	std::u16string		f_getTypeName() { return u"自定义属性"; }
};

#define DEF_网格自定义属性插座(socket)  dynamic_cast<C_网格自定义属性插座*>( (socket) )
#define DEF_网格自定义属性插座数据(socket)  (*(S_网格自定义属性*)( (socket)->f_getData(0)) )

#define DEF_网格自定义属性插座_I(name) socket = new C_网格自定义属性插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输入);
#define DEF_网格自定义属性插座_O(name) socket = new C_网格自定义属性插座( (name) ); f_add插座(socket, E_插座方向::e_插座Type_输出);






class C_实例自定义属性插座 : public C_插座基类 {
	S_实例自定义属性 m_默认值;
	S_实例自定义属性 m_转换值;
public:
	C_实例自定义属性插座(std::u16string name);
	~C_实例自定义属性插座();

	S_实例自定义属性* m_Value;

	void* f_getData(uint8 当前插座连接线ID);
	void  f_setData(void* data, uint8 线程ID = 0);
	std::string	f_构建变量代码(int32 loc);
	bool        f_接入插座是否匹配(E_值类型 type);

	void		f_读取(FILE* f);
	void		f_写入(FILE* f);

	std::u16string		f_getTypeName() { return u"自定义属性"; }
};

#define DEF_实例自定义属性插座(socket)  dynamic_cast<C_实例自定义属性插座*>( (socket) )
#define DEF_实例自定义属性插座数据(socket)  (*(S_实例自定义属性*)( (socket)->f_getData(0)) )

#define DEF_实例自定义属性插座_I(name) f_add插座(new C_实例自定义属性插座( (name) ), E_插座方向::e_插座Type_输入);
#define DEF_实例自定义属性插座_O(name) f_add插座(new C_实例自定义属性插座( (name) ), E_插座方向::e_插座Type_输出);





